//package com.fir.my.batis.plus.task;
//
//import com.fir.my.batis.plus.mapper.DetectionRlMapper;
//import com.sun.nio.file.SensitivityWatchEventModifier;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import java.io.IOException;
//import java.nio.file.*;
//
///**
// * 监听文件更新，不包含子目录
// *
// * 参考 https://zhuanlan.zhihu.com/p/521808292?utm_id=0
// */
//@Component
//public class WatchService_txt {
//    @Autowired
//    DetectionRlMapper detectionRlMapper;
//
//    @Value("${textPath}")
//    private String textPath;
//
//    public void init() throws IOException {
//        Path path = Paths.get(textPath);
////        Path path = Paths.get("D:/DB/");
//        WatchService watcher = FileSystems.getDefault().newWatchService();
//        path.register(watcher, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY},
//                SensitivityWatchEventModifier.HIGH);
//        path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
//        try {
//            while (true) {
//                WatchKey key = watcher.take();
//                for (WatchEvent<?> event : key.pollEvents()) {
//                    if (event.kind() == StandardWatchEventKinds.OVERFLOW) {
//                        continue;
//                    }
//                    Path fileName = (Path) event.context();
//                    System.out.println("文件更新: " + fileName);
//
//                }
//                if (!key.reset()) {
//                    break;
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    public static void main(String[] args) throws IOException {
//        Path path = Paths.get("D://DB/");
//        // 创建WatchService，它是对操作系统的文件监视器的封装，相对之前，不需要遍历文件目录，效率要高很多
//        WatchService watcher = FileSystems.getDefault().newWatchService();
//        path.register(watcher, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY},
//                SensitivityWatchEventModifier.HIGH);
//        // 注册指定目录使用的监听器，监视目录下文件的变化；
//        // PS：Path必须是目录，不能是文件；
//        // StandardWatchEventKinds.ENTRY_MODIFY，表示监视文件的修改事件
//        //        ENTRY_CREATE 目标被创建
//        //        ENTRY_DELETE 目标被删除
//        //        ENTRY_MODIFY 目标被修改
//        //        OVERFLOW 一个特殊的Event，表示Event被放弃或者丢失
//        path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
//        // 创建一个线程，等待目录下的文件发生变化
//        try {
//            while (true) {
//                // 获取目录的变化:
//                // take()是一个阻塞方法，会等待监视器发出的信号才返回。
//                // 还可以使用watcher.poll()方法，非阻塞方法，会立即返回当时监视器中是否有信号。
//                // 返回结果WatchKey，是一个单例对象，与前面的register方法返回的实例是同一个；
//                WatchKey key = watcher.take();
//                // 处理文件变化事件：
//                // key.pollEvents()用于获取文件变化事件，只能获取一次，不能重复获取，类似队列的形式。
//                for (WatchEvent<?> event : key.pollEvents()) {
//                    // event.kind()：事件类型
//                    if (event.kind() == StandardWatchEventKinds.OVERFLOW) {
//                        //事件可能lost or discarded
//                        continue;
//                    }
//                    // 返回触发事件的文件或目录的路径（相对路径）
//                    Path fileName = (Path) event.context();
//                    System.out.println("文件更新: " + fileName);
//                }
//                // 每次调用WatchService的take()或poll()方法时需要通过本方法重置
//                if (!key.reset()) {
//                    break;
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//}
